/** Fichier définissant un hyperboloïde infini.
 *
 * Ce fichier contient la définition de la classe BaseHyperboloide.
 *
 * @file BaseHyperboloide.hpp
 * @author Johan "Solo" Luisier
 *
 * @date 4 Juillet 2011
 */
#ifndef BASEHYPERBOLOIDE_HPP
#define BASEHYPERBOLOIDE_HPP

#include "FormeInfinie.hpp"

#include "boost/shared_ptr.hpp"

/**
 * Classe qui implément l'hyperboloïde, qui est définit par l'équation
 * \f$ \frac{ x^2 }{ a^2 } + \frac{ y^2 }{ b^2 } - \frac{ z^2 }{ c^2 }
 * = 1 \f$. L'hyperboloïde créé n'est pas limité dans l'espace.
 *
 * Pour résoudre l'intersection, on passe dans les coordonées locales
 * et on se réduit au cas \f$ a = b = c = 1 \f$.
 *
 * @author Johan "Solo" Luisier
 *
 * @date 4 Juillet 2011
 *
 * @class BaseHyperboloide "BaseHyperboloide.hpp" "Formes/BaseHyperboloide.hpp"
 */
class BaseHyperboloide : public FormeInfinie
{
public:
    /** Alias pour définir un pointeur intelligent.
     */
    typedef boost::shared_ptr< BaseHyperboloide > SharedPtr;
    BaseHyperboloide();
    BaseHyperboloide( const Coord& sommet,
                      const Vecteur& axeX, const Vecteur& axeY,
                      const Vecteur& axeZ,
                      const double& echelleX, const double& echelleY,
                      const double& echelleZ );
    BaseHyperboloide( const BaseHyperboloide& par );
    virtual ~BaseHyperboloide();
    Coord trouveIntersection(const Rayon& ray) const;
    VecteurU normale(const Coord& coord) const;
    bool estDans(const Coord& coord) const;
    bool estSur(const Coord& coord) const;
    std::ostream& affiche(std::ostream&) const;
    Coord intrinseque(const Coord& pt) const;
    const Coord& sommet() const;
    const VecteurU& axeX() const;
    const VecteurU& axeY() const;
    const VecteurU& axeZ() const;
    const double& echelleX() const;
    const double& echelleY() const;
    const double& echelleZ() const;
protected:
    /**
     * Centre de l'hyperboloide. Il s'agit du barycentre de l'ellipse
     * dans le plan \f$ z = 0 \f$ dans les coordonées locales.
     */
    Coord Sommet;
    /**
     * Axe Ox dans les coordonées locales.
     */
    VecteurU AxeX;
    /**
     * Axe Oy dans les coordonées locales.
     */
    VecteurU AxeY;
    /**
     * Axe Oz dans les coordonées locales.
     */
    VecteurU AxeZ;
    /**
     * Facteur d'échelle selon Ox.
     */
    double EchelleX;
    /**
     * Facteur d'échelle selon Oy.
     */
    double EchelleY;
    /**
     * Facteur d'échelle selon Oz.
     */
    double EchelleZ;
    /**
     * Matrice permettant de passer des coordonées locales aux
     * coordonnées réduites, càd où les trois facteurs d'échelle sont
     * égaux à un.
     */
    MatriceGL3 ReduitCoordonnes;
};

#endif // BASEHYPERBOLOIDE_HPP
